﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using BackEndSystemWebTv.Enums;
using System.Data.Objects.DataClasses;

namespace BackEndSystemWebTv
{
    public partial class Gebruiker
    {
        private static Log log;
        private static Autorisatie auto;

        /// <summary>
        /// Toevoegen van een nieuwe gebruiker en meteen log en autorisatie aanmaken
        /// </summary>        
        public EGebruikerToevoegen NieuweGebruikerToevoegen(string gebruikersnaam, 
            string email, List<ESocialMedium> sM)
        {
            if (!ControleerBestaandeNaam(gebruikersnaam))
            {
                return EGebruikerToevoegen.GebruikersnaamBestaatAl;
            }
            else if (!controleerBestaandeMail(email))
            {
                return EGebruikerToevoegen.EmailBestaatAl;
            }
            else
            {
                Gebruiker g = CreateGebruiker(0, gebruikersnaam, email);
                log = new Log();
                g.Logs.Add(log.MaakStartLog(getGebruikerID(gebruikersnaam), gebruikersnaam));
                foreach (ESocialMedium medium in sM)
                {
                    auto = new Autorisatie();
                    g.Autorisaties.Add(auto.AutorisatieToevoegen(medium, g));
                }
                DatabaseEntities.Instance.AddToGebruikers(g);
                DatabaseEntities.Instance.SaveChanges();

                return EGebruikerToevoegen.Succes;
            }
        }

        /// <summary>
        /// Gebruiker verwijderen. Hiermee wordt alles van bestaande gebruiker verwijderd.
        /// </summary>
        /// <param name="gebruikersnaam"></param>
        /// <returns></returns>
        public EGebruikerVerwijderen BestaandeGebruikerVerwijderen(int gebruikersID)
        {
            var media = 
                from s in DatabaseEntities.Instance.SociaalMediums 
                where s.Autorisatie.GebruikerGebruikersId == gebruikersID 
                select s;

            foreach (var s in media)
            {
                DatabaseEntities.Instance.SociaalMediums.DeleteObject(s);
            }

            var autos = 
                from a in DatabaseEntities.Instance.Autorisaties 
                where a.GebruikerGebruikersId == gebruikersID 
                select a;

            foreach (var a in autos)
            {
                DatabaseEntities.Instance.Autorisaties.DeleteObject(a);
            }
            var logs = 
                from l in DatabaseEntities.Instance.Logs 
                where l.GebruikerGebruikersId == gebruikersID 
                select l;

            foreach (var l in logs)
            {
                DatabaseEntities.Instance.Logs.DeleteObject(l);
            }
            DatabaseEntities.Instance.Gebruikers.DeleteObject(DatabaseEntities.Instance.Gebruikers.First(g => g.GebruikersId == gebruikersID));
            DatabaseEntities.Instance.SaveChanges();
            return EGebruikerVerwijderen.Succes;
        }        

        /// <summary>
        /// Haalt ID op van gebruiker door middel van gebruikersnaam
        /// </summary>
        /// <param name="gebruikersnaam"></param>
        /// <returns></returns>
        public int getGebruikerID(string gebruikersnaam)
        {
            var gebruikers = 
                from g in DatabaseEntities.Instance.Gebruikers 
                where g.Gebruikersnaam == gebruikersnaam 
                select g.GebruikersId;

            foreach (var id in gebruikers)
            {
                return id;
            }
            return 0;
        }       

        /// <summary>
        /// Controleert of Email al in de database bestaat
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        private bool controleerBestaandeMail(string email)
        {
            var emails = from g in DatabaseEntities.Instance.Gebruikers where g.Email == email select g.Email;

            foreach (var e in emails)
            {
                if (e == email)
                    return false;
            }
            return true;
        }


        /// <summary>
        /// Controleert of de gebruikersnaam al in de database bestaat
        /// </summary>
        /// <param name="gebruikersnaam"></param>
        /// <returns></returns>
        public static bool ControleerBestaandeNaam(string gebruikersnaam)
        {
            var vergelijk = 
                from g in DatabaseEntities.Instance.Gebruikers 
                where g.Gebruikersnaam == gebruikersnaam 
                select g.Gebruikersnaam;

            foreach (var g in vergelijk)
            {
                if (g == gebruikersnaam)
                    return false;
            }
            return true;
        }

        /// <summary>
        /// Gebruikersnamen ophalen
        /// </summary>
        /// <returns></returns>
        public List<string> GebruikersnamenOphalen()
        {
            var namen =
                from g in DatabaseEntities.Instance.Gebruikers
                select g.Gebruikersnaam;

            List<string> gebruikersnamen = new List<string>();
            foreach (string s in namen)
            {
                gebruikersnamen.Add(s);
            }
            return gebruikersnamen;
        }       

        /// <summary>
        /// Haal een gebruiker op o.b.v. gebruikersnaam
        /// </summary>
        /// <param name="gebruikersnaam">De ingevoerde gebruikersnaam</param>
        /// <returns>Een gebruiker object</returns>
        public static Gebruiker GebruikerOphalen(string gebruikersnaam)
        {
            var gebruiker =
                from g in DatabaseEntities.Instance.Gebruikers
                where g.Gebruikersnaam == gebruikersnaam
                select g;

            foreach (Gebruiker i in gebruiker)
            {
                return i;
            }
            return null;
        }      
    }
}